class Node {
  constructor(element, next) {
    this.element = element;
    this.next = next;
  }
}
class LinkedList {
  constructor() {
    this.head = null; // 头，默认是空
    this.size = 0; // 链表长度
  }
  /**
   * 增加节点，不是覆盖
   * @param {索引} index
   * @param {节点} element
   */
  add(index, element) {
    // 只有一个参数，就是向末尾添加
    if (arguments.length === 1) {
      element = index;
      index = this.size;
    }

    if (index < 0 || index > this.size) {
      throw new Error('链表索引异常');
    }

    if (index === 0) {
      // 第一项
      let head = this.head; // 老的头
      this.head = new Node(element, head);
    } else {
      // 获取前一个节点
      let prevNode = this.getNode(index - 1); // 前面节点肯定有，没有就走if
      prevNode.next = new Node(element, prevNode.next);
    }

    // console.log(index, element);
    // 累加链表长度
    this.size++;
  }
  // 删除节点
  remove(index) {
    if (this.size === 0) return null;
    let oldNode;
    if (index === 0) {
      // 删除第一个,
      oldNode = this.head;
      this.head = oldNode && oldNode.next;
    } else {
      // 获取当前的前一个节点
      let prevNode = this.getNode(index - 1);
      oldNode = prevNode.next; // 前一个的下一个就是要删除
      prevNode.next = prevNode.next.next; // 让前一个下一个指向之前的下一个
    }
    this.size--;
    return oldNode && oldNode.element; // 返回当前的节点
  }
  // 获取节点
  getNode(index) {
    let current = this.head; // 重头找
    for (let i = 0; i < index; i++) {
      current = current.next;
    }
    return current;
  }
  // 列表的个数
  length() {
    return this.size;
  }
}
module.exports = LinkedList;
